#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

int main()
{
    pid_t id = fork();
    if(id == 0)
    {
        //子进程 
        while(1)
        {
            printf("我是子进程，我的PID : %d, 我的PPID : %d\n", getpid(), getppid());

            //sleep(1);
            sleep(5);

            break;
        }
        exit(111);
    }
    else if(id > 0)
    {
        //父进程
        printf("我是父进程，我的PID : %d, 我的PPID : %d\n", getpid(), getppid());
        sleep(10);//子进程将会有5s的僵尸时间段

        int status = 0;

        //-1是等待任意进程，哪个退出就回收哪一个
        pid_t ret = waitpid(-1, &status, 0);
        if(ret > 0)
        {
            //用宏直接提取
            //检测子进程退出是否正常退出
            if(WIFEXITED(status)) printf("等待成功 : exit code : %d\n", WEXITSTATUS(status));

            //用位操作
            //printf("等待成功, %d, exit sig : %d, exit code : %d\n", ret, status&0x007F, (status&0xFF00) >> 8);
        }
    }
    else 
    {
        //do nothing 
        
    }
    
    sleep(3);//子进程没了，僵尸也被回收了，父进程继续等上3s
    
    return 0;
}

//运行时候卡了一秒，子进程是休眠，父进程是等待
//子进程不退，父进程不退出
//父进程因为子进程没有退出，父进程只能阻塞式的等待子进程退出
//父子进程创建谁先运行不确定，但是子进程一定是先终止的，终止之后父进程一定才返回执行waitpid()后半部分，执行父进程的相关代码
